當在 JavaScript 運行時,其為單線程的運行,也就是所謂的一次只處理一件事,當一件事情完成後再去任務堆疊裡面執行下一個任務,但其本身支援建立非同步請求,讓我們運行了一個請求後,將所要求的任務加入到任務佇列,直到所有主任務執行完後才會開始從任務佇列拉取任務,具體順序為
而在任務佇列中,有著宏任務(macro task)跟微任務(micro task)的差別,微任務的執行優先度會高於宏任務,兩者的任務大概種類如下
兩者混合後的內容會變成是
上面有提到,setTimeout 的任務會晚於主任務執行,因此哪怕我們的延遲時間為 0,也會在主任務完全執行完後才執行 setTimeout 的任務
console.log('start', Date.now())
setTimeout(() => {console.log('macro task', Date.now())}, 0)
let now = Date.now()
while(Date.now() - now < 1000){}
console.log('end', Date.now())
執行結果為